package com.zjsru.plan2023.oneday;

import java.util.Arrays;

/**
 * @Author: cookLee
 * @Date: 2023-10-29
 * H 指数
 */
public class HIndex {

    /**
     * 主
     * \
     * 输入：citations = [3,0,6,1,5]
     * 输出：3
     * 解释：给定数组表示研究者总共有 5 篇论文，每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
     *      由于研究者有 3 篇论文每篇 至少 被引用了 3 次，其余两篇论文每篇被引用 不多于 3 次，所以她的 h 指数是 3。
     *  \
     * @param args args
     */
    public static void main(String[] args) {
        HIndex hIndex = new HIndex();
        int[] citations = new int[]{3,0,6,1,5};
        System.out.println(hIndex.hIndex(citations));

    }

    /**
     * 排序
     *
     * @param citations 引文
     * @return int
     */
    public int hIndex(int[] citations) {
        int h = 0;
        Arrays.sort(citations);
        int len = citations.length - 1;
        while (len >= 0 && citations[len] > h) {
            h++;
            len--;
        }
        return h;
    }

    /**
     * 二分
     *
     * @param citations 引文
     * @return int
     */
    public int hIndex2(int[] citations) {
        int left = 0, right = citations.length;
        Arrays.sort(citations);
        while (left < right) {
            int count = 0;
            //记录中位下载数量来比较
            int mid = (left + right + 1) >> 1;
            for (int i = 0; i < citations.length; i++) {
                if (citations[i] >= mid) {
                    count++;
                }
            }
            //在右区间
            if (count >= mid) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }


}
